package Negocios;

import CDB.Empleados;
import CDB.Permisos;
import CDB.PersonFactory;
import java.awt.HeadlessException;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.metadata.ClassMetadata;

/**
 *
 * @author lightemp y ISC Erick
 */
public class ControlPermissions {

    private Session session;
    private SessionFactory sessionFactory;

    public ControlPermissions() {
    }

    public List selectAll() {
        List listaPermisos;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                listaPermisos = session.createQuery("from Permisos p").list();
                return listaPermisos;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            }
        } catch (HibernateException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            session.flush();
            session.close();
        }

        return null;
    }

    public Permisos selectOne(int id) {
        Permisos per = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los empleados
            per = (Permisos) session.load(Permisos.class, new Integer(id));
            session.close();
            //Retorno la lista con todos los empleados
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return per;
    }

    public Permisos selectOneByUser(int id) {
        Permisos per = null;
        try {
            Session session = createSession();
            //Creacion de query para obtener todos los empleados
            per = (Permisos) session.createQuery("from Permisos p where p.empleados.idempleado="+id).list().get(0);
            //Retorno la lista con todos los empleados
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "El empleado no tiene permisos "
                    + "registrados."+"\n"+"Nota de error: " + e, 
                    "Ha ocurrido un error", 0);
            throw e;
        }
        return per;
    }
    
    public void add(boolean puntoDeVenta, boolean respaldo, boolean restaurar,
            boolean altaProducto, boolean elimEditProducto,
            boolean altaProveedor, boolean elimEditProveedor, boolean altaEmpleado,
            boolean elimEditEmpleado, boolean reporteDeVentas, boolean reporteInvetario,
            boolean catalogoProductos, boolean catalogoEmpleados, boolean catalogoProveedor,
            Empleados empleado, boolean catalogoStock, boolean catalogoCategorias, boolean catalogoSubcategorias,
            boolean catalogoPermisos, boolean reporteproductos, boolean reporteempleados,
            boolean altacategoria, boolean elimcategoria, boolean altasubcategoria,
            boolean elimsubcategoria, boolean cortedecaja, boolean devoluciones) {

        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();
            //construir el empleado apartir de los datos proporcionados
            Permisos permisos = new Permisos();
            permisos.setPuntoventa(puntoDeVenta);
            permisos.setRepaldodb(respaldo);
            permisos.setRestaurardb(restaurar);
            permisos.setAltaproducto(altaProducto);
            permisos.setElimeditproducto(elimEditProducto);
            permisos.setAltaproveedor(altaProveedor);
            permisos.setElimeditproveedor(elimEditProveedor);
            permisos.setAltaempleado(altaEmpleado);
            permisos.setElimeditempleado(elimEditEmpleado);
            permisos.setReporteventas(reporteDeVentas);
            permisos.setReporteinventario(reporteInvetario);
            permisos.setCatalogoproductos(catalogoProductos);
            permisos.setCatalogoempleados(catalogoEmpleados);
            permisos.setCatalogoproveedor(catalogoProveedor);
            permisos.setEmpleados(empleado);
            permisos.setCatalogostock(catalogoStock);
            permisos.setCatalogocategorias(catalogoCategorias);
            permisos.setCatalogosubcategorias(catalogoSubcategorias);
            permisos.setCatalogopermisos(catalogoPermisos);
            permisos.setReporteproductos(reporteproductos);
            permisos.setReporteempleados(reporteempleados);
            permisos.setAltacategoria(altacategoria);
            permisos.setElimcategoria(elimcategoria);
            permisos.setAltasubcategoria(altasubcategoria);
            permisos.setElimsubcategoria(elimsubcategoria);
            permisos.setCortedecaja(cortedecaja);
            permisos.setDevoluciones(devoluciones);

            //Guardar la el empleado mandado
            session.save(permisos);

            //Si no a ocurrido un error 
            tx.commit();
            session.close();
        } catch (Exception e) {
            throw e;
        }

    }

    public void update(int id ,boolean puntoDeVenta, boolean respaldo, boolean restaurar,
            boolean altaProducto, boolean elimEditProducto,
            boolean altaProveedor, boolean elimEditProveedor, boolean altaEmpleado,
            boolean elimEditEmpleado, boolean reporteDeVentas, boolean reporteInvetario,
            boolean catalogoProductos, boolean catalogoEmpleados, boolean catalogoProveedor,
            Empleados empleado, boolean catalogoStock, boolean catalogoCategorias, boolean catalogoSubcategorias,
            boolean catalogoPermisos, boolean reporteproductos, boolean reporteempleados,
            boolean altacategoria, boolean elimcategoria, boolean altasubcategoria,
            boolean elimsubcategoria, boolean cortedecaja, boolean devoluciones) {

        try {
            Session session = createSession();
            Transaction tx = session.beginTransaction();

            //construir el empleado apartir de los datos proporcionados
            Permisos permisos = (Permisos) session.load(Permisos.class,
                    new Integer(id));
            permisos.setPuntoventa(puntoDeVenta);
            permisos.setRepaldodb(respaldo);
            permisos.setRestaurardb(restaurar);
            permisos.setAltaproducto(altaProducto);
            permisos.setElimeditproducto(elimEditProducto);
            permisos.setAltaproveedor(altaProveedor);
            permisos.setElimeditproveedor(elimEditProveedor);
            permisos.setAltaempleado(altaEmpleado);
            permisos.setElimeditempleado(elimEditEmpleado);
            permisos.setReporteventas(reporteDeVentas);
            permisos.setReporteinventario(reporteInvetario);
            permisos.setCatalogoproductos(catalogoProductos);
            permisos.setCatalogoempleados(catalogoEmpleados);
            permisos.setCatalogoproveedor(catalogoProveedor);
            permisos.setEmpleados(empleado);
            permisos.setCatalogostock(catalogoStock);
            permisos.setCatalogocategorias(catalogoCategorias);
            permisos.setCatalogosubcategorias(catalogoSubcategorias);
            permisos.setCatalogopermisos(catalogoPermisos);
            permisos.setReporteproductos(reporteproductos);
            permisos.setReporteempleados(reporteempleados);
            permisos.setAltacategoria(altacategoria);
            permisos.setElimcategoria(elimcategoria);
            permisos.setAltasubcategoria(altasubcategoria);
            permisos.setElimsubcategoria(elimsubcategoria);
            permisos.setCortedecaja(cortedecaja);
            permisos.setDevoluciones(devoluciones);

            //Guardar la el empleado mandado
            session.update(permisos);

            //Si no a ocurrido un error 
            tx.commit();
            session.close();
        } catch (Exception e) {
            throw e;
        }
    }

    public void delete(int idPermisos) {
        Session session = createSession();
        try {
            Transaction tx = session.beginTransaction();
            Permisos producto = (Permisos) session.load(Permisos.class,
                    new Integer(idPermisos));
            session.delete(producto);
            tx.commit();
        } catch (HibernateException e) {
            throw e;
        } finally {
            session.close();
        }

    }

    public String[] getMetadata() {
        try {
            Session session = createSession();
            ClassMetadata metadatos = session.getSessionFactory().getClassMetadata(Permisos.class);
            String[] names = metadatos.getPropertyNames();
            session.close();
            return names;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        }
    }

    public Session createSession() {

        Session session = null;
        try {
            //creando la nueva session para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n" + 
                    "En el controlador de permisos.","Error al crear Session", 
                    0);
            session.close();
        }
        return session;
    }
}
